home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume20 / freeze / patch03 next >
Encoding:
Text File  |  1991-06-28  |  18.7 KB  |  843 lines

  1. Newsgroups: comp.sources.misc
  2. From: Leonid A. Broukhis <leo@s514.ipmce.su>
  3. Subject:  v20i070:  Freeze/Melt compression program, Patch03
  4. Message-ID: <1991Jun27.172727.570@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 6c078afae3add3d77e3d5449b4403aec
  6. Date: Thu, 27 Jun 1991 17:27:27 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Leonid A. Broukhis <leo@s514.ipmce.su>
  10. Posting-number: Volume 20, Issue 70
  11. Archive-name: freeze/patch03
  12. Patch-To: freeze: Volume 17, Issue 67-68
  13.  
  14. Here is the 3rd patch for Freeze/melt program (bug fixes, some
  15. compression speedup, etc.) but I think that Brad Templeton's
  16. compression program will bury my Freeze out. This patch
  17. is probably last (if no more bugs will be found).
  18.  
  19. ------------------ cut here ---------------------
  20. *** ../distribution/README    Wed Mar 27 19:44:41 1991
  21. --- README    Tue Jun 25 13:05:32 1991
  22. ***************
  23. *** 151,157 ****
  24.   
  25.   Compression rate is *INDEPENDENT* of the hash table size, but may vary
  26.   with different static Huffman tables.  It is about 2% worse than the same
  27. ! of ARJ and LHA.
  28.   
  29.   My aim is not the maximum compression, the same range is enough. :-)
  30.   
  31. --- 151,158 ----
  32.   
  33.   Compression rate is *INDEPENDENT* of the hash table size, but may vary
  34.   with different static Huffman tables.  It is about 2% worse than the same
  35. ! of ARJ 1.00 and LHA 2.05, but, unfortunately, ARJ 2.00 beats Freeze
  36. ! on 8%.
  37.   
  38.   My aim is not the maximum compression, the same range is enough. :-)
  39.   
  40. ***************
  41. *** 166,168 ****
  42. --- 167,172 ----
  43.   Encode/Decode_Char/Position), so if you want the speed and/or compression
  44.   rate `a la vogue' you may replace the low-level routines with the homebrew
  45.   (f. ex.) ones and enjoy the results.
  46. + (I tried to implement splay trees instead of Huffman ones and instead of
  47. + static table for position information, but this gives nothing.)
  48. *** ../distribution/bitio.c    Mon May 13 17:05:09 1991
  49. --- bitio.c    Thu Jun 13 21:15:14 1991
  50. ***************
  51. *** 6,15 ****
  52.   
  53.   short GetByte ()
  54.   {
  55. !     register u_short dx = getbuf;
  56.       register u_short c;
  57.   
  58. !     if (getlen <= 8) {
  59.           c = getchar ();
  60.           if ((short)c < 0) {
  61.   
  62. --- 6,15 ----
  63.   
  64.   short GetByte ()
  65.   {
  66. !     register u_short dx = bitbuf;
  67.       register u_short c;
  68.   
  69. !     if (bitlen <= 8) {
  70.           c = getchar ();
  71.           if ((short)c < 0) {
  72.   
  73. ***************
  74. *** 22,32 ****
  75.               corrupt_flag = 1;
  76.               c = 0;
  77.           }
  78. !         dx |= c << (8 - getlen);
  79. !         getlen += 8;
  80.       }
  81. !     getbuf = dx << 8;
  82. !     getlen -= 8;
  83.       return (dx >> 8) & 0xff;
  84.   }
  85.   
  86. --- 22,32 ----
  87.               corrupt_flag = 1;
  88.               c = 0;
  89.           }
  90. !         dx |= c << (8 - bitlen);
  91. !         bitlen += 8;
  92.       }
  93. !     bitbuf = dx << 8;
  94. !     bitlen -= 8;
  95.       return (dx >> 8) & 0xff;
  96.   }
  97.   
  98. ***************
  99. *** 36,42 ****
  100.   short GetNBits (n)
  101.       register u_short n;
  102.   {
  103. !     register u_short dx = getbuf;
  104.       register u_short c;
  105.   
  106.       static u_short mask[17] = {
  107. --- 36,42 ----
  108.   short GetNBits (n)
  109.       register u_short n;
  110.   {
  111. !     register u_short dx = bitbuf;
  112.       register u_short c;
  113.   
  114.       static u_short mask[17] = {
  115. ***************
  116. *** 50,56 ****
  117.           16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
  118.       };
  119.   
  120. !     if (getlen <= 8)
  121.           {
  122.               c = getchar ();
  123.               if ((short)c < 0) {
  124. --- 50,56 ----
  125.           16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
  126.       };
  127.   
  128. !     if (bitlen <= 8)
  129.           {
  130.               c = getchar ();
  131.               if ((short)c < 0) {
  132. ***************
  133. *** 59,69 ****
  134.                   corrupt_flag = 1;
  135.                   c = 0;
  136.               }
  137. !             dx |= c << (8 - getlen);
  138. !             getlen += 8;
  139.           }
  140. !     getbuf = dx << n;
  141. !     getlen -= n;
  142.       return (dx >> shift[n]) & mask[n];
  143.   }
  144.   
  145. --- 59,69 ----
  146.                   corrupt_flag = 1;
  147.                   c = 0;
  148.               }
  149. !             dx |= c << (8 - bitlen);
  150. !             bitlen += 8;
  151.           }
  152. !     bitbuf = dx << n;
  153. !     bitlen -= n;
  154.       return (dx >> shift[n]) & mask[n];
  155.   }
  156.   
  157. ***************
  158. *** 72,79 ****
  159.       register u_short l;
  160.       u_short c;
  161.   {
  162. !     register u_short len = putlen;
  163. !     register u_short b = putbuf;
  164.       b |= c >> len;
  165.       if ((len += l) >= 8) {
  166.           putchar ((int)(b >> 8));
  167. --- 72,79 ----
  168.       register u_short l;
  169.       u_short c;
  170.   {
  171. !     register u_short len = bitlen;
  172. !     register u_short b = bitbuf;
  173.       b |= c >> len;
  174.       if ((len += l) >= 8) {
  175.           putchar ((int)(b >> 8));
  176. ***************
  177. *** 89,94 ****
  178.       }
  179.       if (ferror(stdout))
  180.           writeerr();
  181. !     putbuf = b;
  182. !     putlen = len;
  183.   }
  184. --- 89,94 ----
  185.       }
  186.       if (ferror(stdout))
  187.           writeerr();
  188. !     bitbuf = b;
  189. !     bitlen = len;
  190.   }
  191. *** ../distribution/encode.c    Mon May 13 17:05:10 1991
  192. --- encode.c    Thu Jun 13 22:11:35 1991
  193. ***************
  194. *** 1,5 ****
  195.   #include "freeze.h"
  196.   #include "lz.h"
  197.   
  198.   /*
  199. --- 1,4 ----
  200. ***************
  201. *** 91,99 ****
  202.               if (verbose) {
  203.                   register short pos =
  204.                       (r - 1 - match_position) & (N - 1),
  205. !                 len = match_length;
  206.                   fputc('"', stderr);
  207. !                 for(;len;len--, pos++)
  208.                       fprintf(stderr, "%s",
  209.                           pr_char(text_buf[pos]));
  210.                   fprintf(stderr, "\"\n");
  211. --- 90,98 ----
  212.               if (verbose) {
  213.                   register short pos =
  214.                       (r - 1 - match_position) & (N - 1),
  215. !                 leng = match_length;
  216.                   fputc('"', stderr);
  217. !                 for(; leng; leng--, pos++)
  218.                       fprintf(stderr, "%s",
  219.                           pr_char(text_buf[pos]));
  220.                   fprintf(stderr, "\"\n");
  221. *** ../distribution/freeze.c    Mon May 13 17:05:11 1991
  222. --- freeze.c    Fri Jun  7 18:59:17 1991
  223. ***************
  224. *** 25,30 ****
  225. --- 25,31 ----
  226.    * are now separated.
  227.    * Version 2.2: Tunable static Huffman table for position information,
  228.    * this info may be given in the command string now.
  229. +  * Version 2.2.3: Bug fixes, 10% freezing speedup.
  230.    */
  231.   
  232.   #ifdef COMPAT
  233. ***************
  234. *** 510,517 ****
  235.           else if (debug == 0)    melt();
  236.           else            printcodes();
  237.   #endif /* DEBUG */
  238.           if(topipe == 0) {
  239. !         copystat(*fileptr, ofname);    /* Copy stats */
  240.           if((exit_stat == 1) || (!quiet))
  241.               putc('\n', stderr);
  242.           }
  243. --- 511,523 ----
  244.           else if (debug == 0)    melt();
  245.           else            printcodes();
  246.   #endif /* DEBUG */
  247. +     /* check output status, and close to make sure data is written */
  248. +         if ( ferror(stdout) || fclose(stdout) < 0 )
  249. +         writeerr();
  250.           if(topipe == 0) {
  251. !         copystat(*fileptr);     /* Copy stats */
  252.           if((exit_stat == 1) || (!quiet))
  253.               putc('\n', stderr);
  254.           }
  255. ***************
  256. *** 563,568 ****
  257. --- 569,575 ----
  258.       }
  259.       }
  260.       exit(exit_stat);
  261. +     /*NOTREACHED*/
  262.   }
  263.   
  264.   long in_count = 1;                  /* length of input */
  265. ***************
  266. *** 612,619 ****
  267.       exit ( 1 );
  268.   }
  269.   
  270. ! copystat(ifname, ofname)
  271. ! char *ifname, *ofname;
  272.   {
  273.   #ifdef __TURBOC__
  274.   struct ftime utimbuf;
  275. --- 619,626 ----
  276.       exit ( 1 );
  277.   }
  278.   
  279. ! copystat(ifname)
  280. ! char *ifname;
  281.   {
  282.   #ifdef __TURBOC__
  283.   struct ftime utimbuf;
  284. ***************
  285. *** 660,666 ****
  286.           perror(ofname);
  287.   
  288.   #ifndef MSDOS
  289. !     chown(ofname, statbuf.st_uid, statbuf.st_gid);    /* Copy ownership */
  290.   #endif
  291.   
  292.   #ifdef __TURBOC__
  293. --- 667,674 ----
  294.           perror(ofname);
  295.   
  296.   #ifndef MSDOS
  297. !     /* Copy ownership */
  298. !     chown(ofname, (int) statbuf.st_uid, (int) statbuf.st_gid);
  299.   #endif
  300.   
  301.   #ifdef __TURBOC__
  302. *** ../distribution/huf.c    Mon May 13 18:54:10 1991
  303. --- huf.c    Thu Jun 13 21:15:14 1991
  304. ***************
  305. *** 7,20 ****
  306.   /*                                    */
  307.   /*----------------------------------------------------------------------*/
  308.   
  309. - #ifdef COMPAT
  310. - #undef  N
  311. - #undef  F
  312. - #define F               (new_flg ? _F : _FO)
  313. - #define N               (new_flg ? _NN : _NO)
  314. - #endif
  315.   /* TABLE OF ENCODE/DECODE for upper 6 bits position information */
  316.   
  317.   /* The contents of this table are used for freezing only, so we use
  318. --- 7,12 ----
  319. ***************
  320. *** 40,53 ****
  321.   
  322.   short son[_T];           /* points to son node (son[i],son[i+]) */
  323.   
  324. ! u_short getbuf = 0;
  325. ! uchar    getlen = 0;
  326.   
  327.   uchar corrupt_flag = 0;         /* If a file is corrupt, use fcat */
  328.   
  329. - u_short putbuf = 0;
  330. - uchar putlen = 0;
  331.   /* Initialize tree */
  332.   
  333.   StartHuff ()
  334. --- 32,42 ----
  335.   
  336.   short son[_T];           /* points to son node (son[i],son[i+]) */
  337.   
  338. ! u_short bitbuf = 0;
  339. ! uchar    bitlen = 0;
  340.   
  341.   uchar corrupt_flag = 0;         /* If a file is corrupt, use fcat */
  342.   
  343.   /* Initialize tree */
  344.   
  345.   StartHuff ()
  346. ***************
  347. *** 80,87 ****
  348.   #ifdef DEBUG
  349.       symbols_out = refers_out = 0;
  350.   #endif
  351. !     putlen = getlen = 0;
  352. !     putbuf = getbuf = 0;
  353.       corrupt_flag = 0;
  354.   }
  355.   
  356. --- 69,76 ----
  357.   #ifdef DEBUG
  358.       symbols_out = refers_out = 0;
  359.   #endif
  360. !     bitlen = 0;
  361. !     bitbuf = 0;
  362.       corrupt_flag = 0;
  363.   }
  364.   
  365. ***************
  366. *** 218,225 ****
  367.   
  368.   EncodeEnd ()
  369.   {
  370. !     if (putlen) {
  371. !         putchar((int)(putbuf >> 8));
  372.           bytes_out++;
  373.           if (ferror(stdout))
  374.               writeerr();
  375. --- 207,214 ----
  376.   
  377.   EncodeEnd ()
  378.   {
  379. !     if (bitlen) {
  380. !         putchar((int)(bitbuf >> 8));
  381.           bytes_out++;
  382.           if (ferror(stdout))
  383.               writeerr();
  384. ***************
  385. *** 228,243 ****
  386.   
  387.   short DecodeChar ()
  388.   {
  389. !     register u_short c;
  390. !     register u_short dx;
  391. !     register u_short cc;
  392.       c = son[_R];
  393.   
  394.       /* trace from root to leaf,
  395.          got bit is 0 to small(son[]), 1 to large (son[]+1) son node */
  396.       while (c < _T) {
  397. !         dx = getbuf;
  398. !         if (getlen <= 8) {
  399.               if ((short)(cc = getchar()) < 0) {
  400.                   if (corrupt_flag) {
  401.                       corrupt_message();
  402. --- 217,230 ----
  403.   
  404.   short DecodeChar ()
  405.   {
  406. !     register u_short c, cc, dx;
  407.       c = son[_R];
  408.   
  409.       /* trace from root to leaf,
  410.          got bit is 0 to small(son[]), 1 to large (son[]+1) son node */
  411.       while (c < _T) {
  412. !         dx = bitbuf;
  413. !         if (bitlen <= 8) {
  414.               if ((short)(cc = getchar()) < 0) {
  415.                   if (corrupt_flag) {
  416.                       corrupt_message();
  417. ***************
  418. *** 246,256 ****
  419.                   corrupt_flag = 1;
  420.                   cc = 0;
  421.               }
  422. !             dx |= cc << (8 - getlen);
  423. !             getlen += 8;
  424.           }
  425. !         getbuf = dx << 1;
  426. !         getlen--;
  427.           c += (dx >> 15) & 1;
  428.           c = son[c];
  429.       }
  430. --- 233,243 ----
  431.                   corrupt_flag = 1;
  432.                   cc = 0;
  433.               }
  434. !             dx |= cc << (8 - bitlen);
  435. !             bitlen += 8;
  436.           }
  437. !         bitbuf = dx << 1;
  438. !         bitlen--;
  439.           c += (dx >> 15) & 1;
  440.           c = son[c];
  441.       }
  442. ***************
  443. *** 321,328 ****
  444.       /* trace from root to leaf,
  445.          got bit is 0 to small(son[]), 1 to large (son[]+1) son node */
  446.       while (c < _TO) {
  447. !         dx = getbuf;
  448. !         if (getlen <= 8) {
  449.               if ((short)(cc = getchar()) < 0) {
  450.                   if (corrupt_flag) {
  451.                       corrupt_message();
  452. --- 308,315 ----
  453.       /* trace from root to leaf,
  454.          got bit is 0 to small(son[]), 1 to large (son[]+1) son node */
  455.       while (c < _TO) {
  456. !         dx = bitbuf;
  457. !         if (bitlen <= 8) {
  458.               if ((short)(cc = getchar()) < 0) {
  459.                   if (corrupt_flag) {
  460.                       corrupt_message();
  461. ***************
  462. *** 331,341 ****
  463.                   corrupt_flag = 1;
  464.                   cc = 0;
  465.               }
  466. !             dx |= cc << (8 - getlen);
  467. !             getlen += 8;
  468.           }
  469. !         getbuf = dx << 1;
  470. !         getlen--;
  471.           c += (dx >> 15) & 1;
  472.           c = son[c];
  473.       }
  474. --- 318,328 ----
  475.                   corrupt_flag = 1;
  476.                   cc = 0;
  477.               }
  478. !             dx |= cc << (8 - bitlen);
  479. !             bitlen += 8;
  480.           }
  481. !         bitbuf = dx << 1;
  482. !         bitlen--;
  483.           c += (dx >> 15) & 1;
  484.           c = son[c];
  485.       }
  486. *** ../distribution/huf.h    Wed Mar 27 19:45:04 1991
  487. --- huf.h    Thu Jun 13 21:15:15 1991
  488. ***************
  489. *** 1,9 ****
  490. ! extern u_short getbuf;
  491. ! extern uchar    getlen;
  492.   
  493.   extern uchar corrupt_flag;
  494. - extern u_short putbuf;
  495. - extern uchar putlen;
  496.   
  497.   #define MAX_FREQ        (u_short)0x8000 /* tree update timing from frequency */
  498. --- 1,6 ----
  499. ! extern u_short bitbuf;
  500. ! extern uchar    bitlen;
  501.   
  502.   extern uchar corrupt_flag;
  503.   
  504.   #define MAX_FREQ        (u_short)0x8000 /* tree update timing from frequency */
  505. *** ../distribution/lz.c    Mon May 13 15:12:09 1991
  506. --- lz.c    Fri Jun  7 18:48:53 1991
  507. ***************
  508. *** 18,28 ****
  509.   hash_t             prev[N + 1];
  510.   
  511.   #ifndef __XENIX__
  512. - u_short
  513.   #ifdef __TURBOC__
  514. !     huge
  515. ! #endif
  516. !         next[array_size];
  517.   #else
  518.   #if parts == 2
  519.   u_short next0[32768], next1[8193];
  520. --- 18,28 ----
  521.   hash_t             prev[N + 1];
  522.   
  523.   #ifndef __XENIX__
  524.   #ifdef __TURBOC__
  525. ! u_short huge * next = (u_short huge *) NULL;
  526. ! #else
  527. ! u_short next[array_size];
  528. ! #endif /* TURBOC */
  529.   #else
  530.   #if parts == 2
  531.   u_short next0[32768], next1[8193];
  532. ***************
  533. *** 66,71 ****
  534. --- 66,80 ----
  535.       node_steps = node_matches = 0;
  536.   #endif
  537.   
  538. + #ifdef __TURBOC__
  539. +     if (!next && (next = (u_short huge *)
  540. +             farmalloc(array_size * sizeof(u_short))) == NULL) {
  541. +         fprintf(stderr, "Not enough memory (%dK wanted)\n",
  542. +             array_size * sizeof(u_short) / 1024);
  543. +         exit(3);
  544. +     }
  545. + #endif
  546.       for (i = N + 1; i < array_size; i++ )
  547.           nextof(i) = NIL;
  548.       for (i = 0; i < sizeof(prev)/sizeof(*prev); i++ )
  549. ***************
  550. *** 76,119 ****
  551.   Get_Next_Match (r)
  552.       u_short r;
  553.   {
  554. !     register uchar  *key;
  555. !     register u_short        m, i, p;
  556.   #ifdef GATHER_STAT
  557.       node_matches++;
  558.   #endif
  559. -     key = &text_buf[p = r];
  560. -     m = 0;
  561. -     while (m < _F) {
  562. -         if ((p = nextof(p)) == NIL) {
  563. -             match_length = m;
  564. -             return;
  565. -         }
  566.   
  567. ! /* This statement is due to ideas of Boyer and Moore: */
  568.   
  569. !         if(key[m] != text_buf[p + m])
  570. !             continue;
  571.   
  572. ! /* This statement is due to my ideas: :-) */
  573. ! /* It gives up to 8% speedup on files with big redundancy (text, etc.) */
  574.   
  575. !         if(key[m >> 1] != text_buf[p + (m >> 1)])
  576. !             continue;
  577.   
  578.   #ifdef GATHER_STAT
  579.           node_steps++;
  580.   #endif
  581.   
  582. ! /* This statement doesn't take a lot of execution time -
  583. !     about 20% (in profiling we trust)
  584. ! */
  585. !         for (i = 0; i < _F && key[i] == text_buf[p + i];  i++);
  586. !         if (i > m) {
  587. !             match_position = ((r - p) & (N - 1)) - 1;
  588. !             m = i;
  589. !         }
  590. !     }
  591.   #ifdef DEBUG
  592.       if (verbose)
  593.           fprintf(stderr, "Replacing node: %d -> %d\n", p, r);
  594. --- 85,121 ----
  595.   Get_Next_Match (r)
  596.       u_short r;
  597.   {
  598. !     register u_short p = r;
  599. !     register int m;
  600. !     register uchar  *key = text_buf + r, *pattern;
  601.   #ifdef GATHER_STAT
  602.       node_matches++;
  603.   #endif
  604.   
  605. !     match_length = 0;
  606. !     do {
  607. !         do {
  608. !             if ((p = nextof(p)) == NIL)
  609. !                 return;
  610. !             pattern = text_buf + p;
  611.   
  612. ! /* This statement is due to ideas of Boyer and Moore: */
  613.   
  614. !             for (m = match_length;
  615. !                 m >= 0 && key[m] == pattern[m]; m--);
  616.   
  617. !         } while (m >= 0);
  618.   
  619.   #ifdef GATHER_STAT
  620.           node_steps++;
  621.   #endif
  622.   
  623. !         for (m = match_length;
  624. !             ++m < _F && key[m] == pattern[m]; );
  625. !         match_length = m;
  626. !         match_position = ((r - p) & (N - 1)) - 1;
  627. !     } while (m < _F);
  628.   #ifdef DEBUG
  629.       if (verbose)
  630.           fprintf(stderr, "Replacing node: %d -> %d\n", p, r);
  631. ***************
  632. *** 121,125 ****
  633.       nextof(prev[p]) = nextof(p);
  634.       prev[nextof(p)] = prev[p];
  635.       prev[p] = NIL;  /* remove p, it is further than r */
  636. -     match_length = _F;
  637.   }
  638. --- 123,126 ----
  639. *** ../distribution/lz.h    Mon May 13 17:05:12 1991
  640. --- lz.h    Tue Jun 25 12:40:25 1991
  641. ***************
  642. *** 36,46 ****
  643.   
  644.   #ifndef __XENIX__
  645.   #define nextof(i)       next[i]
  646. - extern u_short
  647.   #ifdef __TURBOC__
  648. !         huge
  649. ! #endif
  650. !             next[];
  651.   #else
  652.   #define parts (array_size/32768 + 1)
  653.   #define nextof(i)       next[(i) >> 15][(i) & 0x7fff]
  654. --- 36,46 ----
  655.   
  656.   #ifndef __XENIX__
  657.   #define nextof(i)       next[i]
  658.   #ifdef __TURBOC__
  659. ! extern u_short huge * next;
  660. ! #else
  661. ! extern u_short next[];
  662. ! #endif /* TURBOC */
  663.   #else
  664.   #define parts (array_size/32768 + 1)
  665.   #define nextof(i)       next[(i) >> 15][(i) & 0x7fff]
  666. *** ../distribution/makefile    Mon May 13 17:05:13 1991
  667. --- makefile    Tue Jun 25 12:26:33 1991
  668. ***************
  669. *** 1,3 ****
  670. --- 1,4 ----
  671. + SHELL         = /bin/sh
  672.   DEST          = /usr/local/bin
  673.   MANDEST       = /usr/local/man/cat1
  674.   EXTHDRS          =
  675. ***************
  676. *** 9,15 ****
  677.   
  678.   CC            = gcc 
  679.   
  680. ! CFLAGS        = -DBITS=18 -O -DCOMPAT -fstrength-reduce #-DBSD42 -DSUN4
  681.   
  682.   LINTFLAGS     = -DBITS=15 -DCOMPAT -DDEBUG -DGATHER_STAT -x
  683.   
  684. --- 10,16 ----
  685.   
  686.   CC            = gcc 
  687.   
  688. ! CFLAGS        = -DBITS=18 -O -fstrength-reduce #-DBSD42 -DSUN4
  689.   
  690.   LINTFLAGS     = -DBITS=15 -DCOMPAT -DDEBUG -DGATHER_STAT -x
  691.   
  692. ***************
  693. *** 42,48 ****
  694.   all:            $(PROGRAM) statist $(CATMAN)
  695.   
  696.   lint:           $(SRCS)
  697. !         lint $(LINTFLAGS) $(SRCS) $(LIBS)
  698.   
  699.   $(PROGRAM):     $(OBJS) 
  700.           $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
  701. --- 43,49 ----
  702.   all:            $(PROGRAM) statist $(CATMAN)
  703.   
  704.   lint:           $(SRCS)
  705. !         lint $(LINTFLAGS) $(SRCS) > lint.out
  706.   
  707.   $(PROGRAM):     $(OBJS) 
  708.           $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM)
  709. ***************
  710. *** 50,58 ****
  711.   statist: statist.c freeze.h lz.h huf.h
  712.           $(CC) $(CFLAGS) -UCOMPAT $(LDFLAGS) -o statist statist.c $(LIBS)
  713.   
  714. ! clean:;         rm -f *.o *.b .,* core a.out $(PROGRAM) statist
  715.   
  716.   install:        $(DEST)/$(PROGRAM) $(MANDEST)/$(MAN)
  717.   
  718.   $(DEST)/$(PROGRAM): $(PROGRAM)
  719.           install -s -c $(PROGRAM) $(DEST)
  720. --- 51,64 ----
  721.   statist: statist.c freeze.h lz.h huf.h
  722.           $(CC) $(CFLAGS) -UCOMPAT $(LDFLAGS) -o statist statist.c $(LIBS)
  723.   
  724. ! clean:;         rm -f *.o *.b .,* core *.out $(PROGRAM) statist
  725.   
  726.   install:        $(DEST)/$(PROGRAM) $(MANDEST)/$(MAN)
  727. + patch:;         rm -f patch.out
  728. +         -for i in ../distribution/* ; do \
  729. +         (diff -c $$i `basename $$i` >> patch.out); \
  730. +         done
  731.   
  732.   $(DEST)/$(PROGRAM): $(PROGRAM)
  733.           install -s -c $(PROGRAM) $(DEST)
  734. *** ../distribution/patchlevel.h    Mon May 13 17:05:13 1991
  735. --- patchlevel.h    Tue Jun  4 20:12:31 1991
  736. ***************
  737. *** 1 ****
  738. ! #define PATCHLEVEL 2
  739. --- 1 ----
  740. ! #define PATCHLEVEL 3
  741. *** ../distribution/statist.c    Mon May 13 15:12:12 1991
  742. --- statist.c    Tue May 14 21:18:45 1991
  743. ***************
  744. *** 69,78 ****
  745.   #endif
  746.   giveres() {
  747.       u_short c;
  748.       signal(SIGINT, giveres);
  749.       for(c = 0; c < 62; c++) {
  750.           register short *p;
  751. -         register int j, k;
  752.   
  753.           j = 0;
  754.           p = prnt;
  755. --- 69,78 ----
  756.   #endif
  757.   giveres() {
  758.       u_short c;
  759. +     register int j, k;
  760.       signal(SIGINT, giveres);
  761.       for(c = 0; c < 62; c++) {
  762.           register short *p;
  763.   
  764.           j = 0;
  765.           p = prnt;
  766. ***************
  767. *** 79,92 ****
  768.           k = p[c + T];
  769.   
  770.           do j++; while ((k = p[k]) != R) ;
  771. !         if (j <= 8)
  772.               bits[j]++;
  773.       }
  774. !     printf("%d %d %d %d %d %d %d %d\n",
  775. !         bits[1], bits[2], bits[3], bits[4],
  776. !         bits[5], bits[6], bits[7], bits[8]);
  777.       fflush(stdout);
  778. !     for (c = 1; c <= 8; c++) bits[c] = 0;
  779.   }
  780.   
  781.   freeze ()
  782. --- 79,114 ----
  783.           k = p[c + T];
  784.   
  785.           do j++; while ((k = p[k]) != R) ;
  786. !         if (j <= 6)
  787.               bits[j]++;
  788.       }
  789. !     k = bits[1] + bits[2] + bits[3] + bits[4] +
  790. !     bits[5] + bits[6];
  791. !     k = 62 - k;     /* free variable length codes for 7 & 8 bits */
  792. !     j = 128 * bits[1] + 64 * bits[2] + 32 * bits[3] +
  793. !     16 * bits[4] + 8 * bits[5] + 4 * bits[6];
  794. !     j = 256 - j;    /* free byte images for these codes */
  795. ! /*      Equation:
  796. !         bits[7] + bits[8] = k
  797. !     2 * bits[7] + bits[8] = j
  798. ! */
  799. !     j -= k;
  800. !     if (j < 0 || k < j) {
  801. !         printf("Not enough information\n");
  802. !     } else {
  803. !         bits[7] = j;
  804. !         bits[8] = k - j;
  805. !         printf("%d %d %d %d %d %d %d %d\n",
  806. !             bits[1], bits[2], bits[3], bits[4],
  807. !             bits[5], bits[6], bits[7], bits[8]);
  808. !     }
  809.       fflush(stdout);
  810. !     for (c = 1; c <= 6; c++) bits[c] = 0;
  811.   }
  812.   
  813.   freeze ()
  814. ------------------ cut here ---------------------
  815. -- 
  816. Leonid A. Broukhis | 89-1-95 Liberty St. | "BROUKHIS" is Hebrew for
  817. 7+095 494.6241 (h) | Moscow 123481 USSR  |       "BENEDICTAE"
  818. 7+095 132.9475 (o) | (leo@s514.ipmce.su) | {Licet omnia qualibet dicas}
  819.  
  820. exit 0 # Just in case...
  821. -- 
  822. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  823. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  824. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  825. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  826.